package jp.co.oec_ltd.db;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;

import jp.co.oec_ltd.ini.Memoini;

import android.content.ContentValues;
import android.content.Context;
import android.content.res.AssetManager;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Environment;
import android.util.Log;

public class DatabaseHelper extends SQLiteOpenHelper {


    /** DBネーム */
    public final static String DB_NAME      = "Memo.db";
    /** DBネーム(バックアップ) */
    public final static String DB_NAME_BKUP = "Memo.db.bkup";

    /** DBバージョン */
    private final static int   DB_VER       = 1;

    /** アプリケーションコンテキスト */
    private Context            mContext;

    /** コンストラクタ */
    public DatabaseHelper(Context context) {
        super(context, DB_NAME, null, DB_VER);
        mContext = context;
    }

    /** データベースパス */
    public final static String DB_PATH = "/data/data/jp.co.oec_ltd.Memo_Apl/databases/";

    /**
     * asset に格納したデータベースをコピーするための空のデータベースを作成する
     *
     **/
    public void createDataBase() throws IOException {
        boolean dbExist = checkDataBaseExists();

        if (dbExist) {
            // すでにデータベースは作成されている
            Log.d("DatabaseHelper", "DB exist");
        } else {
            Log.d("DatabaseHelper", "DB not exist");
            // このメソッドを呼ぶことで、空のデータベースが
            // アプリのデフォルトシステムパスに作られる
            this.getReadableDatabase();

            try {
                // asset に格納したデータベースをコピーする
                if(!copyDataBaseFromSdcard()) {
                    copyDataBaseFromAsset();
                }
            } catch (IOException e) {
                throw new Error("Error copying database");
            }
        }
    }

    /**
     * 再コピーを防止するために、すでにデータベースがあるかどうか判定する
     *
     * @return true=存在有り、false=存在無し
     */
    private boolean checkDataBaseExists() {
        String dbPath = DB_PATH + DB_NAME;
//        return FileUtil.isExistsFile(dbPath);
        return true;

    }

    /**
     * asset に格納したデータベースをデフォルトの データベースパスに作成した空のデータベースにコピーする
     * */
    private void copyDataBaseFromAsset() throws IOException {

        // asset 内のデータベースファイルにアクセス
        InputStream input = mContext.getAssets().open(DB_NAME);

        // デフォルトのデータベースパスに作成した空のDB
        String outFileName = DB_PATH + DB_NAME;

        OutputStream output = new FileOutputStream(outFileName);

        // コピー
        byte[] buffer = new byte[1024];
        int size;
        while ((size = input.read(buffer)) > 0) {
            output.write(buffer, 0, size);
        }

        // Close the streams
        output.flush();
        output.close();
        input.close();
    }

    /**
     * SDカード内のデータベースをデフォルトの データベースパスに作成した空のデータベースにコピーする
     * */
    private boolean copyDataBaseFromSdcard() {

        FileInputStream input = null;
        OutputStream output = null;
        try {
            File sdFile = new File(Environment.getExternalStorageDirectory()
                    .getPath() + "/Lilliput.db");

            // SDにファイルが無ければ失敗とする
            if(!sdFile.exists()) {
                return false;
            }

            // SDカード 内のデータベースファイルにアクセス
            input = new FileInputStream(sdFile);

            // デフォルトのデータベースパスに作成した空のDB
            String outFileName = DB_PATH + DB_NAME;

            output = new FileOutputStream(outFileName);

            // コピー
            byte[] buffer = new byte[1024];
            int size;
            while ((size = input.read(buffer)) > 0) {
                output.write(buffer, 0, size);
            }
            return true;
        } catch(IOException e) {
            return false;
        } finally {
            if(output != null) {
                try {
                    output.flush();
                    output.close();
                } catch (IOException e) {
                }
            }
            if(input != null) {
                try {
                    input.close();
                } catch (IOException e) {
                }
            }
        }
    }



    /** アップグレード時に呼ばれる？未使用 */
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // TODO 自動生成されたメソッド・スタブ

    }

    /**
     * assets/sql/create下のSQLファイルを実行する sqlは、ファイル内にて"/"で区切ることにより連続実行する
     * 未使用
     *
     * @param db
     * @param assetsDir
     * @throws IOException
     */
    @SuppressWarnings("unused")
    private void execSql(SQLiteDatabase db, String assetsDir) throws IOException {
        AssetManager as = mContext.getResources().getAssets();
        try {
            String files[] = as.list(assetsDir);
            for (int i = 0; i < files.length; i++) {
                String str = readFile(as.open(assetsDir + "/" + files[i]));
                for (String sql : str.split("/")) {
                    db.execSQL(sql);
                }
            }
        } catch (SQLException ex) {
            ex.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * SQLが書かれたファイルを読込む
     * 未使用
     * @param is
     *            インプットストリーム
     * @return 読み込んだ文字列
     * @throws IOException
     */
    private String readFile(InputStream is) throws IOException {
        BufferedReader br = null;
        try {
            br = new BufferedReader(new InputStreamReader(is, "UTF-8"));

            StringBuilder sb = new StringBuilder();
            String str;
            while ((str = br.readLine()) != null) {
                sb.append(str + "\n");
            }
            return sb.toString();
        } finally {
            if (br != null)
                br.close();
        }
    }
/////////////////////////////////////////////////////////////////////↓から作成
    /**
     * 初期投入サンプルデータ
     */
//    private String[][] datas = new String[][]{
//        {"光度　人", "××商事", "開発部", "部長","141-0031", "品川区西五反田2-19-3", "090-1111-1111", "03-1111-1111", "code@shoji.co.jp"},
//        {"高度　仁", "○○コミュニケーションズ", "開発部", "課長","141-0032", "品川区大崎1-2-1", "090-2222-2222", "03-2222-2222", "code@comunications.co.jp"},
//        {"光度　陣", "×○システムズ", "開発部", null,"153-0043", "目黒区東山1-2-1", "090-3333-3333", "03-3333-3333", "code@systems.co.jp"},
//        {"荒土　尋", "○×工務店", "開発部", null,"160-0014", "新宿区内藤町11-4", "090-4444-4444", "03-4444-4444", "code@koumuten.co.jp"}
//    };
    private String[][] datas = new String[][]{
            {"0", "b", "0","-1"},
            {"1", "a", "1","0"},
            {"2", "a", "2","0"},
            {"3", "a", "3","0"},
            {"4", "a", "4","0"},
            {"5", "a", "5","1"},
            {"6", "a", "",""},
            {"7", "a", "",""},
            {"8", "a", "",""},
            {"9", "a", "",""},
        };




    /** 作成時に呼ばれる */
    @Override
    public void onCreate(SQLiteDatabase db) {
        /* noto--
        try {
            //assets/sql/create下のSQLファイルを実行する
            execSql(db, "sql/create");
        } catch (IOException e) {
            e.printStackTrace();
        }
        */
        db.beginTransaction();

        try{
            // テーブルの生成
//            StringBuilder createSql = new StringBuilder();
//            createSql.append("create table " + Memoini.TABLE_NAME + " (");
//            createSql.append(Memoini.COLUMN_ID + " integer primary key autoincrement not null,");
//            createSql.append(Memoini.COLUMN_PERSON_NAME + " text not null,");
//            createSql.append(Memoini.COLUMN_COMPANY_NAME + " text,");
//            createSql.append(Memoini.COLUMN_ORGANIZATION_NAME + " text,");
//            createSql.append(Memoini.COLUMN_POSITION_NAME + " text,");
//            createSql.append(Memoini.COLUMN_ZIP_CODE + " text,");
//            createSql.append(Memoini.COLUMN_ADDRESS + " text,");
//            createSql.append(Memoini.COLUMN_TEL1 + " text,");
//            createSql.append(Memoini.COLUMN_TEL2 + " text,");
//            createSql.append(Memoini.COLUMN_MAIL + " text");
//            createSql.append(")");
//
//            db.execSQL( createSql.toString());


//            public static final String COLUM_NO = "no";
//            public static final String COLUM_TEXT = "test";
//            public static final String COLUM_CHG_NO = "cng_no";
            StringBuilder createSql = new StringBuilder();

            createSql.append("create table " + Memoini.TABLE_NAME + " (");
            createSql.append(Memoini.COLUM_NO + " integer primary key autoincrement not null,");
            createSql.append(Memoini.COLUM_TEXT + " text,");
            createSql.append(Memoini.COLUM_CHG_NO + " integer,");
            createSql.append(Memoini.COLUM_NOW_NO + " integer");
            createSql.append(")");
            db.execSQL( createSql.toString());


            // サンプルデータの投入
//            for( String[] data: datas){
//                ContentValues values = new ContentValues();
//                values.put(Memoini.COLUMN_PERSON_NAME, data[ 0]);
//                values.put(Memoini.COLUMN_COMPANY_NAME, data[ 1]);
//                values.put(Memoini.COLUMN_ORGANIZATION_NAME, data[ 2]);
//                values.put(Memoini.COLUMN_POSITION_NAME, data[ 3]);
//                values.put(Memoini.COLUMN_ZIP_CODE, data[ 4]);
//                values.put(Memoini.COLUMN_ADDRESS, data[ 5]);
//                values.put(Memoini.COLUMN_TEL1, data[ 6]);
//                values.put(Memoini.COLUMN_TEL2, data[ 7]);
//                values.put(Memoini.COLUMN_MAIL, data[ 8]);
//                db.insert(Memoini.TABLE_NAME, null, values);
//            }
//            db.setTransactionSuccessful();
            for( String[] data: datas){
                ContentValues values = new ContentValues();
                values.put(Memoini.COLUM_NO, data[ 0]);
                values.put(Memoini.COLUM_TEXT, data[ 1]);
                values.put(Memoini.COLUM_CHG_NO, data[ 2]);
                values.put(Memoini.COLUM_NOW_NO, data[ 3]);
                db.insert(Memoini.TABLE_NAME, null, values);
            }
            db.setTransactionSuccessful();
        } finally {
            db.endTransaction();
        }

    }

}
